package displayboardinfo.messages;

import java.util.ArrayList;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

import org.hibernate.Hibernate;

import displayboardinfo.entities.Admission;

/**
 * Odpowiedź usługi listowania okresów przyjęć konkretnego gabinetu.
 * Zobacz również: {@link displayboardinfo.services.AdmissionsServices#list(javax.xml.bind.JAXBElement)}}
 * 
 * @author Artur Jaworski
 */
@XmlRootElement
public class ListAdmissionsRes {
	
	private ArrayList<Admission> admissions;
	
	/**
	 * Domyślny konstruktor bezargumentowy
	 */
	public ListAdmissionsRes() {
		setAdmissions(new ArrayList<Admission>());
	}
	
	/**
	 * Pobranie listy okresów przyjęć danego gabinetu.
	 * 
	 * @return lista przyjęć danego gabinetu
	 */
	@XmlElementWrapper ( name = "admissions" )
	@XmlElement ( name = "admission" )
	public ArrayList<Admission> getAdmissions() {
		return admissions;
	}

	/**
	 * Ustawienie listy okresów przyjęć danego gabinetu.
	 * Pojedyncze okresy przyjęć należy dodawać używając metody {@link #addAdmission(Admission)}
	 * 
	 * @param admissions lista przyjęć danego gabinetu
	 */
	public void setAdmissions(ArrayList<Admission> admissions) {
		this.admissions = admissions;
	}
	
	/**
	 * Dodanie pojedynczego okresu przyjęć do listy okresów przyjęć.
	 * W celu uniknięcia odwołań cyklicznych oraz zachowania poufności danych, zerowane są następujące pola:
	 * <ul>
	 * <li> {@link Admission#getUser()}: admissions, password, rooms </li>
	 * <li> {@link Admission#getRoom()} </li>
	 * </ul>
	 * 
	 * @param admission okres przyjęć dodawany do listy
	 */
	public void addAdmission(Admission admission){
		Hibernate.initialize(admission);
		
		Hibernate.initialize(admission.getUser());
		admission.getUser().setAdmissions(null);
		admission.getUser().setPassword(null);
		admission.getUser().setRooms(null);
		
		admission.setRoom(null);
		
		this.admissions.add(admission);
	}
	
}
